import 'package:protobuf/protobuf.dart';
import 'package:fixnum/fixnum.dart'; // 用于处理 Int64 类型
import 'package:logger/logger.dart'; // 引入 logger 包
import 'protos/report.pb.dart'; // 根据实际路径调整

// 初始化 logger
final logger = Logger(
  printer: PrettyPrinter(
    methodCount: 0, // 方法调用的深度
    errorMethodCount: 5, // 错误追踪的方法调用深度
    lineLength: 120, // 每行日志的最大长度
    colors: true, // 是否启用颜色
    printEmojis: true, // 是否打印表情符号
  ),
);

void main() {
  // 创建 RawStage 对象
  RawStage rawStage = RawStage()
    ..startTime = Int64(DateTime.now().millisecondsSinceEpoch)
    ..endTime = Int64(DateTime.now().add(Duration(minutes: 5)).millisecondsSinceEpoch)
    ..status = SleepStatus.STATUS_N2;

  // 设置 raw_db 字段（位操作）
  int deltaDb = 0x12;  // 示例值 (0-255)
  int thetaDb = 0x34;  // 示例值 (0-255)
  int betaDb = 0x56;   // 示例值 (0-255)
  int alphaDb = 0x78;  // 示例值 (0-255)

  rawStage.rawDb = (deltaDb & 0xFF) << 24 | 
                  (thetaDb & 0xFF) << 16 | 
                  (betaDb & 0xFF) << 8 | 
                  (alphaDb & 0xFF);

  // 序列化
  List<int> serialized = rawStage.writeToBuffer();
  logger.i('[序列化成功] 二进制长度: ${serialized.length} bytes');

  // 反序列化
  RawStage deserialized = RawStage.fromBuffer(serialized);

  // 验证数据
  logger.d('\n=== 原始数据 ===');
  printRawStage(rawStage);

  logger.d('\n=== 反序列化数据 ===');
  printRawStage(deserialized);

  // 分解 raw_db 字段
  logger.d('\n=== raw_db 分解 ===');
  final rawDb = deserialized.rawDb.toInt();
  logger.d('原始值: 0x${rawDb.toRadixString(16).padLeft(8, '0')}');
  logger.d('deltaDb: 0x${(rawDb >> 24 & 0xFF).toRadixString(16)}');
  logger.d('thetaDb: 0x${(rawDb >> 16 & 0xFF).toRadixString(16)}');
  logger.d('betaDb:  0x${(rawDb >> 8 & 0xFF).toRadixString(16)}');
  logger.d('alphaDb: 0x${(rawDb & 0xFF).toRadixString(16)}');
}

void printRawStage(RawStage stage) {
  logger.d('开始时间: ${stage.startTime} (${DateTime.fromMillisecondsSinceEpoch(stage.startTime.toInt())})');
  logger.d('结束时间: ${stage.endTime} (${DateTime.fromMillisecondsSinceEpoch(stage.endTime.toInt())})');
  logger.d('睡眠状态: ${stage.status.name} (${stage.status.value})');
  logger.d('原始数据(raw_db): 0x${stage.rawDb.toRadixString(16)}');
}